package com.example.apidocserver.interfaces.facade;

import com.alibaba.druid.util.StringUtils;
import com.example.apidocserver.application.event.FieldEvent;
import com.example.apidocserver.domain.document.entity.ApiParamField;
import com.example.apidocserver.infrastructure.aop.PermissionAnno;
import com.example.apidocserver.infrastructure.util.ParamUtil;
import com.example.apidocserver.infrastructure.util.result.ResultData;
import com.example.apidocserver.infrastructure.util.result.ResultUtils;
import com.example.apidocserver.interfaces.assembler.CommonAssembler;
import com.example.apidocserver.interfaces.assembler.FieldAssembler;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Objects;

/**
 * 字段相关字段
 *
 * @author xyqlg
 */
@RestController
@RequestMapping("field")
public class FieldController {
    @Resource
    private FieldEvent fieldEvent;

    /**
     * 查询显示名称字段
     *
     * @param world   字段名称
     * @param apiId   接口id
     * @param spaceId 工作空间id
     * @return 字段集合数据
     */
    @GetMapping("like")
    public ResultData findLikeFields(@RequestParam("world") String world, @RequestParam("apiId") Integer apiId,
                                     @RequestParam("spaceId") Integer spaceId) {
        if (StringUtils.isEmpty(world) || !ParamUtil.matherStr(world)) {
            ResultUtils.failure("参数不能为空，或只能汉字、字母大小写、数组");
        }
        if (Objects.isNull(apiId)) {
            ResultUtils.failure("接口id不能为空");
        }
        if (Objects.isNull(spaceId)) {
            ResultUtils.failure("空间id不能为空");
        }
        return ResultUtils.success(fieldEvent.findLikeFields(world, apiId, spaceId));
    }

    /**
     * 查询相同字段
     *
     * @param field 字段信息
     * @return 单个字段信息
     */
    @PostMapping("uniKey")
    public ResultData findByUinKey(@RequestBody ApiParamField field) {
        FieldAssembler.checkFieldUniKey(field);
        return ResultUtils.success(fieldEvent.findByUinKey(field));
    }

    /**
     * 查询工作空间所有字段说明
     *
     * @param spaceId 工作空间id
     * @return 字段说明集合
     */
    @GetMapping("/findBySpaceId/{spaceId}")
    public ResultData findBySpaceId(@PathVariable("spaceId") Integer spaceId) {
        CommonAssembler.checkInt(spaceId);
        return ResultUtils.success(fieldEvent.findBySpaceId(spaceId));
    }

    /**
     * 修改字段
     *
     * @param field 字段说明信息
     * @return 结果
     */
    @PutMapping("upsertOne")
    @PermissionAnno
    public ResultData upsertOne(@RequestBody ApiParamField field) {
        FieldAssembler.checkFieldUniKey(field);
        fieldEvent.upsertOne(field);
        return ResultUtils.success();
    }

    /**
     * 根据id删除数据
     *
     * @param fieldId 字段信息
     * @return 结果
     */
    @DeleteMapping("{fieldId}")
    @PermissionAnno
    public ResultData deleteById(@PathVariable("fieldId") Integer fieldId) {
        CommonAssembler.checkInt(fieldId);
        return ResultUtils.success(fieldEvent.deleteById(fieldId));
    }
}
